package common.server.redis;


import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Administrator
 * @version [版本号, 2017/11/22 0022]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public interface RedisResource<E>  extends RealResource<E>{

    /**
     * 读取 k-v
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    <T> T get(String key, Class<T> clazz);

    /**
     * 读取 hash
     * @param key
     * @param field
     * @param clazz
     * @param <T>
     * @return
     */
    <T> T hget(String key, String field, Class<T> clazz);

    /**
     *
     * @param key
     * @return
     */
    Map<String, String> hgetAll(String key);


    /**
     *
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    <T> Map<String, T> hgetAll(String key, Class<T> clazz);

    /**
     * 
     * 描述: 
     * @author     xuhang
     */
    Long hincrby(String key, String field);
    /**
     *
     * @param key
     * @return
     */
    Set<String> hkeys(String key);

    /**
     *
     * @param key
     * @param clazz
     * @param fields
     * @param <T>
     * @return
     */
    <T> List<T> hmget(String key, Class<T> clazz, String... fields);

    /**
     * 移除并且返回 key 对应的 list 的第一个元素
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    <T> T lpop(String key, Class<T> clazz);


    /**
     *  从队列的右边出队一个元素
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    <T> T rpop(String key, Class<T> clazz);

    /**
     *  从列表中获取指定返回的元素 start 和 end
     * 偏移量都是基于0的下标，即list的第一个元素下标是0（list的表头），第二个元素下标是1，以此类推。
     * 偏移量也可以是负数，表示偏移量是从list尾部开始计数。 例如， -1 表示列表的最后一个元素，-2 是倒数第二个，以此类推。
     * @param key
     * @param start
     * @param end
     * @param clazz
     * @param <T>
     * @return
     */
    List<String> lrange(String key, int start, int end);

    /**
     * 返回存储在 key 里的list的长度。 如果 key 不存在，那么就被看作是空list，并且返回长度为 0。 当存储在 key
     * 里的值不是一个list的话，会返回error。
     * @param key
     * @return
     */
    long llen(String key);

    /**
     *  从列表中获取指定返回的元素 start 和 end
     * 偏移量都是基于0的下标，即list的第一个元素下标是0（list的表头），第二个元素下标是1，以此类推。
     * 偏移量也可以是负数，表示偏移量是从list尾部开始计数。 例如， -1 表示列表的最后一个元素，-2 是倒数第二个，以此类推
     * @param key
     * @param start
     * @param end
     * @param clazz
     * @param <T>
     * @return
     */
    <T> List<T> zrange(String key, int start, int end, Class<T> clazz);


    /**
     *  设置K-V
     * @param key
     * @param value
     * @param time
     */
    void  set(String key, String value, long time);

    /**
     *  设置K-V
     * @param key
     * @param value
     * @param time
     */
    Long setnx(String key, String value, long time);
    
    /**
     *
     * @param key
     * @param value
     * @param time
     */
    void  set(String key, Object value, long time);

    /**
     *
     * @param key
     */
    void del(String key);

    /**
     *
     * @param key
     * @param field
     * @param value
     * @param time 单位为s
     */
    void  hset(String key, String field, String value, long time);

    /**
     *
     * @param key
     * @param field
     * @param value
     * @param time 单位为s
     */
    void  hset(String key, String field, Object value, long time);

    /**
     *
     * @param key
     * @param field
     */
    void  hdel(String key, String field);


    /**
     *
     * @param key
     * @param hash
     */
    void hmset(String key, Map<String, String> hash);

    /**
     *
     * @param key
     * @param hash
     * @param time
     */
    void hmset(String key, Map<String, String> hash, long time);

    /**
     *
     * @param key
     * @param value
     */
    void lpush(String key, String... value);

    /**
     *
     * @param key
     * @param value
     */
    void lpush(String key, Object value);

    /**
     *
     * @param key
     * @param value
     */
    void rpush(String key, String value);

    /**
     *
     * @param key
     * @param value
     */
    void rpush(String key, Object value);

    /**
     * 设置失效时间
     * @param key
     * @param time
     */
    void expire(String key, long time);

    /**
     * set集合追加元素
     *
     * @param key
     *
     * @param value
     */
    void sadd(String key, String... value);

}
